package org.lisy.java.oop;

/**
 * 内存结构
 * 
 * @author lisy
 */
public class MemoryOperate {

	/**
	 * java内存结构大概分为：
	 * 1. 寄存器：最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
	 * 2. 栈(stack)：存放基本类型的变量数据和对象的引用，但对象本身不存放在栈中，而是存放在堆（new 出来的对象）或者常量池中（字符串常量对象存放在常量池中。）
	 * 3. 堆(heap)：存放所有new出来的对象。
	 * 4. 静态域：存放静态成员（static定义的）
	 * 5. 常量池：存放字符串常量和基本类型常量（public static final）。
	 * 6. 非RAM存储：硬盘等永久存储空间
	 */
	public static void main(String[] args) {
		// 基本数据类型为值传递，String类型传递与基本数据类型的传递效果相似
		int a = 1;
		int b = a;
		a = 100;
		System.out.println("a:" + System.identityHashCode(a));
		System.out.println("b:" + System.identityHashCode(b));
		System.out.println("a=" + a + ", b=" + b);
		// 实参-形参，原始类型的数据，拷贝，形参的变化不会影响实参的值
		change(a);
		System.out.println("a=" + a);

		// 8种基本数据类型以外的数据类型都为引用类型
		int a1[] = { 1, 3, 5 };
		int b1[] = a1; // 栈内存中进行复制地址，a和b指向同一块堆空间中的数组
		int c1[] = a1.clone(); // 堆内存中进行复制，c指向了堆空间中新分配的数组
		System.out.println("a:" + a1.hashCode());
		System.out.println("b:" + b1.hashCode());
		System.out.println("c:" + c1.hashCode());
		System.out.println("b数组:");
		printArray(b1); // b: 1, 3, 5
		b1[0] = 100;
		System.out.println("a数组：");
		printArray(a1); // a: 100, 3, 5
		System.out.println("a数组(2):");
		c1[0] = 66; // a: 100, 3, 5
		printArray(a1);

		int a11[] = { 1, 3, 5 };
		System.out.println("a：" + a11.hashCode());
		System.out.println("a数组(1):");
		printArray(a11); // 1 3 5
		
		// 数组名代表数组的首地址-传递的是数组，在栈中复制数组的地址-共同指向堆中的同一块内存空间，形参的变化会影响实参的值，传输组，传对象
		change1(a11);
		System.out.println("a数组(2):");
		printArray(a11);

		MemoryOperate d01 = new MemoryOperate();
		MemoryOperate d02 = new MemoryOperate();
		System.out.println(d01.hashCode());
		System.out.println(d02.hashCode());
	}
	
	public static void change(int x) {
		x = 88;
	}
	
	public static void change1(int x[]) {
		System.out.println("x：" + x.hashCode());
		for (int i = 0; i < x.length; i++) {
			x[i] = 0;
		}
	}
	
	/**
     * 打印数组中的元素用逗号隔开
     * @param array
     */
	public static void printArray(int[] array) {
		for (int i = 0; i < array.length; i++) {
			// 最后一个
			if (i == array.length - 1) {
				System.out.println(array[i]);
			} else {
				System.out.print(array[i] + ",");
			}
		}
	}
}
